/* 
 * 基于 vue-vben-admin 的 ant-design-vue 项目
 * 该项目基于 vue-vben-admin 项目，使用 ant-design-vue 组件库
 * 项目结构参考 vue-vben-admin 项目
 * 作用：核心构建配置文件
 *  编译项目代码，生成静态文件，用于部署到服务器，提供前端服务。
 */
import { defineConfig } from '@vben/vite-config';

import { loadEnv } from 'vite';

import vitePluginOss from './plugins/vite-plugin-oss.mjs';

// 定义 Vite 配置
// 用于编译项目代码，生成静态文件，用于部署到服务器，提供前端服务。
export default defineConfig(async ({ mode }) => {
  // 加载环境变量
  const env = loadEnv(mode, process.cwd());

  // 定义后端 URL
  const backendUrl = env.VITE_BACKEND_URL || 'http://localhost:8000';

  // 定义 AI URL
  const aiUrl = env.VITE_AI_URL || 'http://localhost:8010';

  // 定义是否为构建模式
  const isBuild = mode === 'production';
  
  // 定义是否启用 OSS 插件
  // 用于将静态文件上传到 OSS 存储桶
  // 仅在构建模式下启用
  const isOssEnabled = env.VITE_OSS_ENABLED === 'true';
  
  // 定义 VITE_BASE_URL_PROD
  // 用于指定 OSS 存储桶中的静态文件路径前缀
  // 仅在构建模式下启用
  // 例如：如果 VITE_BASE_URL_PROD 为 '/static/'，则 OSS 存储桶中的静态文件路径为 '/static/[文件名]'
  return {
    application: {},
    vite: {
      base: isBuild && isOssEnabled ? env.VITE_BASE_URL_PROD : '',
      server: {
        host: '0.0.0.0', // 监听所有网络接口
        port: 5678, // 监听端口号

        // 配置反向代理
        // 用于将前端请求代理到后端服务器
        // 例如：如果前端请求 '/api/ai'，则会被代理到 AI URL
        // 如果前端请求 '/api/admin'，则会被代理到后端 URL
        proxy: {
          '/api/ai': {
            target: aiUrl,
            changeOrigin: true,
          },
          '/api/admin': {
            target: backendUrl,
            changeOrigin: true,
          },
        },
      },
      // 配置插件
      plugins: [
        vitePluginOss({
          enabled: env.VITE_OSS_ENABLED === 'true', // 启用 OSS 插件
          region: env.VITE_OSS_REGION, // OSS 存储桶区域
          accessKeyId: env.VITE_OSS_ACCESS_KEY_ID, // OSS 访问密钥 ID
          accessKeySecret: env.VITE_OSS_ACCESS_KEY_SECRET, // OSS 访问密钥 Secret
          bucket: env.VITE_OSS_BUCKET, // OSS 存储桶名称
          prefix: env.VITE_OSS_PREFIX || '', // OSS 存储桶中的静态文件路径前缀
          deleteLocal: env.VITE_OSS_DELETE_LOCAL === 'true', // 是否在上传完成后删除本地静态文件
        }),
      ],
    },
  };
});
